package cn.kent.heima.high.garbage;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;

/**
 * 演示 软引用 配合引用队列 使用
 * 引用类型分类如下:
 * 强引用
 * 软引用
 * 弱引用
 * 虚引用
 * 终结器引用
 *
 * -Xmx20m -XX:+PrintGCDetails -verbose:gc
 */
public class Demo_15 {

    private static final int _4Mb = 1024 * 1024 * 4;

    public static void main(String[] args) {
        soft();
    }

    public static void soft() {
        // list -> SoftReference -> byte[]

        List<SoftReference<byte[]>> list = new ArrayList<>();
        // 引用队列
        ReferenceQueue<byte[]> queue = new ReferenceQueue<>();

        for (int i = 0; i < 5; i++) {
            // 关联了引用队列, 当软引用关联的 byte[] 被回收时, 软引用自己会加入到queue中去
            SoftReference<byte[]> ref = new SoftReference<>(new byte[_4Mb], queue);
            System.out.println(ref.get());
            list.add(ref);
            System.out.println(list.size());
        }

        // 从队列中获取无用的 软引用对象, 并移除
        Reference<? extends byte[]> poll = queue.poll();
        while (poll != null) {
            list.remove(poll);
        }

        for (SoftReference<byte[]> ref : list) {
            System.out.println(ref.get());
        }
    }

}
